import time

import allure
from pywinauto import Desktop

from api.input_api import input_data, clear_input_field
from api.login_api import click_button
from config.data import KEY
from tools.logger import log_info, log_warning, log_error


def unbind_and_assert(relation_inquiry_win, barcode: str, assertion_func, name='SemiPACK条码',
                      key=KEY, timeout=5):
    """
    输入条码进行查询，并进行断言。
    如果条码合法，弹出权限密钥输入窗口，输入密钥后先进行密钥判断，如果密钥错误会提示“权限密钥错误”，如果密钥正确则没有此提示；如果条码不合法，直接弹出提示窗口。
    然后再进行断言判断
    :param timeout: 默认超时时间5秒
    :param key: 权限密钥，默认使用KEY
    :param name: 输入数据的名字，默认是“SemiPACK条码”
    :param assertion_func: 断言函数类型
    :param barcode: 输入的条码数据
    :param relation_inquiry_win: 关联查询窗口
    :param
    """
    log_info("🔍 开始解绑条码：{}".format(barcode))

    # 清空并输入条码
    with allure.step(f"清空并输入{name}: '{barcode}'"):
        clear_input_field(relation_inquiry_win, auto_id="TextBox1", field_name=name)
        input_data(relation_inquiry_win, barcode, name=name)
        time.sleep(0.2)

    with allure.step("点击【解绑】按钮"):
        log_info("🖱 点击【解绑】按钮")
        click_button(relation_inquiry_win, "解绑")

    # === 窗口分支处理 ===
    desktop = Desktop(backend='win32')
    permission_win = desktop.window(title="条码关联系统-解绑权限确认")
    prompt_win = desktop.window(title="条码关联系统-提示")

    # Step: 等待并识别弹出的窗口
    with allure.step("检测解绑操作后弹出的窗口类型"):
        permission_exists = permission_win.exists(timeout=2)
        prompt_exists = prompt_win.exists(timeout=timeout) if not permission_exists else False

        if permission_exists:
            log_info("✅ 检测到权限确认窗口")
        elif prompt_exists:
            log_info("🟡 检测到直接提示窗口（无需权限）")
        else:
            raise AssertionError("❌ 既未检测到权限确认窗口，也未检测到结果提示窗口，流程异常")

    # Step: 处理权限确认（如需要）
    if permission_exists:
        with allure.step("处理权限确认流程"):
            log_info("✅ 检测到权限确认窗口，正在输入密钥...")
            log_info(f"权限密钥：{'*' * len(key)}")
            permission_win.set_focus()
            input_data(permission_win, key, "权限密钥", "Passwordtxt")
            click_button(permission_win, "确定")

            # 检查密钥验证结果
            time.sleep(1)
            try:
                tip_label = permission_win.child_window(auto_id="TipInfolbl")
                if tip_label.exists(timeout=1):
                    tip_text = tip_label.window_text().strip()
                    if "密钥验证失败" in tip_text:
                        log_warning(f"密钥验证失败提示：{tip_text}")
                        click_button(permission_win, "关闭")
                    else:
                        log_error(f"❌ 非预期的密钥提示: {tip_text}")
                        raise AssertionError(f"密钥验证失败，实际提示: {tip_text}")
            except Exception as e:
                log_error(f"❌ 密钥验证异常: {e}")
                raise AssertionError("密钥验证过程出错")

            # 等待最终提示窗口
            with allure.step("等待解绑结果提示窗口"):
                if not prompt_win.exists(timeout=timeout):
                    raise AssertionError("❌ 输入密钥后未弹出结果提示窗口")
                prompt_win.wait('visible', timeout=timeout)

    # Step: 确保结果提示窗口已就绪（无论是否经过权限）
    with allure.step("确认解绑结果提示窗口已显示"):
        if not prompt_win.exists(timeout=timeout):
            raise AssertionError("❌ 未检测到解绑结果提示窗口")
        prompt_win.wait('visible', timeout=timeout)

    # === 执行断言 ===
    with allure.step("执行解绑结果断言"):
        log_info(f"正在执行断言：{assertion_func.__name__}")
        assertion_func()